DialogflowのFulfillmentにAWS Lambdaを利用する [Google Home]
渡辺です。
Google Home (Actions)のバックエンドの処理を実装する場合、最初の選択肢となるのはGoogleのCloud Functionsです。 でも、Lambdaで書きたいじゃないですかw
というわけで、今回はDialogflowのFulfillmentでLambda連携する手順を解説します。
DialogflowのFulfillment
Google Homeでハローワールドでも触れましたが、Actions(Dialogflow)では、バックエンド処理は必須でありません。 インテントのTraning PhrasesとResponsesを定義すれば、一定のインプットに対するアウトプットを簡単に定義できます。 しかし、他のAPIを叩いたり、DBから情報を取得したり、なんらかのロジックを必要とする場合はバックエンド処理が必要です。 このバックエンド処理を Fulfillment と呼びます。
Fulfillmentは、WebhookまたはCloud Functionsで実装します。 AWS Lambdaを利用する場合、API Gateway経由でWebhookとして実行します。
なお、Dialogflowでは、 Intent毎にFulfillmentの有効/無効 を設定できます。 ただし、Fulfillmentとして指定できるWebhookやCloud Functionsは各Intentで共通となるので注意してください。
Lambdaの作成
バックエンド処理を実装するLambda関数dialogflow-backend
を作成します。
今回はNode.jsでシンプルに固定メッセージを返す実装としました。
exports.handler = async (event) => { console.log(JSON.stringify(event)); let resp = { fulfillmentText: 'はい、こんにちは' }; return resp; };
この後、API Gatewayと連携するため、レスポンスとして返したいJSONオブジェクトをそのまま返しましょう。 詳細なレスポンスフォーマットは、ドキュメントを参照してください。
なお、FulfillmentにはV2 APIとV1 APIの2種類があり、2018年前半にV2 APIに切り替わっています。 今後はV1 APIを選択できませんので、 V2 API準拠 で作らなければなりません。
API Gatewayの作成
LambdaをWebhookとして呼び出せるように、API Gatewayを作成します。
適当な名前(dialogflow-webhook)でAPIを作成し、POSTリソースを作成してください。 「統合タイプ」はLambda関数を選択し、先ほど作成したLambda関数dialogflow-backendを指定します。
本来、あとはデプロイするだけでWebhookとして利用できるのですが、2018年8月時点で、このままでは文字化けを起こしてしまいます。 レスポンスヘッダを修正し、charsetを追加しましょう。
メソッドレスポンスをクリックします。
200レスポンスのコンテンツタイプを「application/json」から「application/json; charset=UTF-8」に修正します。
デプロイします。
ステージ名は適当につけてください。 ここではdevとしました。
ダッシュボードからAPIのURLを確認します。
なお、今回はサンプルのため、認証は省略しました。 必要に応じてAPI GatewayにAPIキーを設定してください。
DialogflowのFulfillmentを設定する
DialogflowのFulfillmentを開き、Webhookを有効にします。 URLにはAPI GatewayのURLを設定してください。
IntentのFulfillmentを有効にする
最後にIntentのFulfillmentを有効にします。
これ、結構忘れがちで、なんでLambda呼ばれないんだ!となるので注意してください:p Dialogflowでは、WebhookによるFulfillmentはオプション です。
動作確認
Dialogflowのシミュレータを使って動作確認しましょう。
成功(失敗)したら、DIAGONOSTIC INFOをクリックします。
Fulfillmentへのリクエスト及びにレスポンスが確認出来るので、デバッグに便利です。
まとめ
DialogflowのFulfillmentと、FulfillmentのWebhookをLambdaで実装する方法について解説しました。 Lambda側では、Intentを判定して処理を分岐するように実装すれば、Alexaスキルと同じようなコードでAIアシスタントを作成できるでしょう。 細かい違いはありますが、同じAIスピーカー、基本的な概念は大きく変わりません。